﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

// pour pouvoir utiliser le framework de test unitaires..*
using NUnit.Framework;

// pour pouvoir utiliser nos objets métier.
using AFCEPF.BankApplication.BLL;
// pour pouvoir utiliser nos objets d'accès aux données.
using AFCEPF.BankApplication.DAL;
// Pour pouvoir utiliser nos objets Mock et utilitaires.
using AFCEPF.BankApplication.Tests.Utilities;

namespace AFCEPF.BankApplication.Tests
{
    [TestFixture]
    public class Test_AbstractDbAccessor
    {
        private MockPerson _mock;

        [TearDown]
        public void TearDown()
        {
            ConfigFileManager.SetConfigFileDatabaseType(ConfigFileManager.KEY_DBTYPE_SQLSERVER);
        }

        [Test]
        public void Test_Property_ConnectionString()
        {
            _mock = new MockPerson();

            // on récupère la connection string depuis le fichier de config..
            string expected = ConfigFileManager.GetKeyValue(ConfigFileManager.KEY_CONNECTIONSTRING);
            string actual = _mock.DbAccessor.ConnectionString;

            Assert.AreEqual(expected, actual);
        }


        [Test]
        public void Test_Property_Mapper_ForNotNull()
        {
            _mock = new MockPerson();

            Assert.NotNull(_mock.DbAccessor.MappedObject);
        }


        [Test]
        public void Test_Property_SqlGenerator_ForSqlServer()
        {
            ConfigFileManager.SetConfigFileDatabaseType(ConfigFileManager.KEY_DBTYPE_SQLSERVER);
            _mock = new MockPerson();

            Assert.IsInstanceOf<SqlServerSqlGenerator>(_mock.DbAccessor.SqlGenerator);

        }

        [Test]
        public void Test_Property_SqlGenerator_ForMySql()
        {
            ConfigFileManager.SetConfigFileDatabaseType(ConfigFileManager.KEY_DBTYPE_MYSQL);
            _mock = new MockPerson();

            Assert.IsInstanceOf<MySqlSqlGenerator>(_mock.DbAccessor.SqlGenerator);
        }

        [Test]
        public void Test_Property_SqlGenerator_ForUnknownDatabaseType()
        {
            ConfigFileManager.SetConfigFileDatabaseType(ConfigFileManager.KEY_DBTYPE_UNKNOWN);

            Assert.Throws<InvalidDatabaseTypeException>(() => new MockPerson());
            ConfigFileManager.SetConfigFileDatabaseType(ConfigFileManager.KEY_DBTYPE_SQLSERVER);

        }
    }
}
